﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {

    /// <summary>
    /// <c>Attribute</c> 変数をあらわす構造体
    /// </summary>
    /// <remarks>
    /// この構造体はCPU側からシェーダーに渡す <c>Attribute</c> 変数(頂点データ)をラップしたものです。
    /// 変数名(<see cref="Name"/>)と転送するデータ(<see cref="VertexArray"/>)の組みを保存します。
    /// 指定された頂点データがシェーダー側の同名の<c>Attibute</c> 変数に送られます。
    /// ユーザーが<see cref="AttributeVariable"/> 型のオブジェクトを直接インスタンス化することはできません｡
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// この構造体はCPU側からシェーダーに転送するデータをラップしたものであり､
    /// シェーダー側で宣言された変数については <see cref="ShaderDeclaration"/> 構造体が保存します｡
    /// シェーダー プログラムの詳細については <see cref="ShaderProgram"/> を参照してください。
    /// </remarks>
    /// <seealso cref="UniformVariable"/>
    /// <seealso cref="ShaderDeclaration"/>
    public struct AttributeVariable {

        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="name"><c>Attribute</c> 変数名</param>
        /// <param name="varry">頂点データ(<see cref="VertexArray"/> オブジェクト)</param>
        internal AttributeVariable (string name, VertexArray varry)
            : this () {
            this.Name = name;
            this.VertexArray = varry;
        }

        /// <summary>
        /// <c>Attribute</c> 変数名
        /// </summary>
        /// <remarks>
        /// <c>Attribute</c> 変数の名前です。
        /// シェーダー側で宣言された同一の名前の変数に対応します。
        /// 大文字小文字を厳密に判定します。
        /// </remarks>
        public string Name { get; private set; }

        /// <summary>
        /// 頂点データ(<see cref="VertexArray"/>)
        /// </summary>
        /// <remarks>
        /// 指定の<c>Attribute</c> 変数に送られる頂点データです。
        /// </remarks>
        public VertexArray VertexArray { get; private set; }

        /// <inheritdoc/>
        public override string ToString () {
            return string.Format ("AttfibuteVariable : Name={0}, VertexArray={1}", Name, VertexArray);
        }
    }
}
